package beans;

import com.google.inject.Inject;
import DAO.Factory;
import beans.util.PageBean;
import guice.IExcelIteraction;
import logic.Good;
import org.apache.log4j.Logger;

import javax.faces.context.FacesContext;
import javax.faces.model.ListDataModel;
import javax.servlet.http.HttpServletResponse;
import javax.validation.constraints.NotNull;
import java.io.IOException;
import java.io.Serializable;
import java.util.List;

/**
 * Created by Волков Олег on 25.04.14.
 */
public class GoodsBean extends PageBean implements Serializable {
    @NotNull
    @Inject
    private IExcelIteraction excel;

    private Good singleGood;

    private static final Logger logger = Logger.getLogger(GoodsBean.class);

    /**
     * Индекс текущего поля таблицы
     */
    private int currentIndex;

    /**
     * Модель
     */
    private ListDataModel model = null;

    /**
     * Адрес для перенаправления на страницу загрузки файлов из Excel
     */
    private String uploadPageURL = "upload";

    /**
     * Коллекция для первоначальной инициализации таблицы данными из БД
     */
    private List<Good> list;

    public GoodsBean() {
        init();
    }

    /**
     * Инациализация
     */
    public void init() {
        list=Factory.getInstance().getGoodDAO().getAllGoods();
        model = new ListDataModel(list);
        singleGood = new Good();
    }

    /**
     * Обновление данных на странице
     */
    public void reloadData() {
        list = Factory.getInstance().getGoodDAO().getAllGoods();
        model = new ListDataModel(list);
        logger.info("Data has been updated");
    }

    /**
     * Выгрузка данных в Excel
     */
    public void writeExcel() {
        excel.excelExport(list);
        logger.info("Uploading complete");
    }

    /**
     * Удаление строки из таблицы
     */
    public void deleteGood() {
        Factory.getInstance().getGoodDAO().deleteGood(singleGood);
        list.remove(currentIndex);
        logger.info("Data has been updated");
        clearAll();
    }

    /**
     * Редактирование поля таблицы или добавление нового поля
     */
    public void saveGood() {
        if (currentIndex == 0) {
            Factory.getInstance().getGoodDAO().addGood(singleGood);
            list.add(singleGood);
        } else {
            Factory.getInstance().getGoodDAO().updateGood(singleGood);
            list.set(currentIndex,singleGood);
        }
        clearAll();
    }

    /**
     * Перенаправление на страницу для заргузки данных из Excel-файла
     */
    public void goUpload() {
        HttpServletResponse response = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();
        try {
            response.sendRedirect(uploadPageURL);
        } catch (IOException e) {
            logger.error("IO problems " + e.getMessage());
        }
    }

    /**
     * Обнуление переменных singleGood и currentIndex
     */
    public void clearAll() {
        singleGood = new Good();
        currentIndex = 0;
    }

    // Гетеры и сетеры----------------------------------------------------------

    public ListDataModel getModel() {
        return model;
    }

    public Good getSingleGood() {
        return singleGood;
    }

    public void setSingleGood(Good singleGood) {
        this.singleGood = singleGood;
    }

    public int getCurrentIndex() {
        return currentIndex;
    }

    public void setCurrentIndex(int currentIndex) {
        this.currentIndex = currentIndex;
    }
}
